#ifndef DATAPACKAGE_H
#define DATAPACKAGE_H

#include "format.h"
#include <QString>

/*
 * 这个类是描述数据包信息的
 * +-----+------------+
 * | type| infomation |
 * +-----+------------+
 * |  1  |    arp     |
 * +-----+------------+
 * |  2  |    icmp    |
 * +-----+------------+
 * |  3  |    tcp     |
 * +-----+------------+
 * |  4  |    udp     |
 * +-----+------------+
 * |  5  |    dns     |
 * +-----+------------+
 * |  6  |    tls     |
 * +-----+------------+
 * |  7  |    ssl     |
 * +-----+------------+
*/

class Datapackage
{
private:
    u_int data_length; // 数据包长度
    QString timeStamp; // 包的时间戳
    QString info; // 包的信息介绍
    int package_type; // 类型
protected:
    static QString byteToString(u_char *str, int size); // 将byteArray转换为QString
public:
    const u_char *pkt_content; // 包数据的根指针
public:
    Datapackage();
    ~Datapackage() = default;
    // 设置变量
    void setDatalength(u_int data_length); // 设置包的长度
    void setTimeStamp(QString timeStamp); // 设置时间戳
    void setPackageType(int type); // 设置包的类型
    void setPointer(const u_char *pkt_content, int size); // 设置包的指针
    void setInfo(QString info); // 设置包的信息

    // 获取变量
    QString getDatalength(); // 获取包的长度
    QString getTimeStamp(); // 获取时间戳
    QString getPackageType(); // 获取包的类型
    QString getInfo(); // 获取一个包的信息
    QString getSource(); // 获取包的源地址
    QString getDestination(); // 获取包的目的地址


    QString getDesMacAddr(); // 获取目的MAC地址
    QString getSrcMacAddr(); // 获取源MAC地址
    QString getMacType(); // 获取MAC地址的类型

    // 获取IP信息
    QString getDesIpAddr(); // 获取目的IP地址
    QString getSrcIpAddr(); // 获取源IP地址
    QString getIpVersion();                   // 获取IP版本
    QString getIpHeaderLength();              // 获取IP头长度
    QString getIpTos();                       // 获取IP地址
    QString getIpTotalLength();               // 获取IP总包长度
    QString getIpIdentification();            // 获取IP标识
    QString getIpFlag();                      // 获取IP标志
    QString getIpReservedBit();               // 获取IP的反应位
    QString getIpDF();                        // 获取ip DF标志[不要分段]
    QString getIpMF();                        // 获取ip MF标志[更多片段]
    QString getIpFragmentOffset();            //获取ip分片偏移量
    QString getIpTTL();                       // 获取IP TTL[生存时间]
    QString getIpProtocol();                  // 获取IP协议
    QString getIpCheckSum();                  //获取校验和
    // 获取icmp信息
    QString getIcmpType();                    // 获取icmp类型
    QString getIcmpCode();                    // 获取icmp代码
    QString getIcmpCheckSum();                // 获取icmp校验和
    QString getIcmpIdentification();          // 获取icmp标识
    QString getIcmpSequeue();                 // 获取icmp序列
    QString getIcmpData(int size);            // 获取icmp数据

    // 获取arp信息
    QString getArpHardwareType();             // 获取arp硬件类型
    QString getArpProtocolType();             // 获取arp协议类型
    QString getArpHardwareLength();           // 获取arp硬件长度
    QString getArpProtocolLength();           // 获取arp协议长度
    QString getArpOperationCode();            // 获取arp操作代码
    QString getArpSourceEtherAddr();          // 获取arp源以太网地址
    QString getArpSourceIpAddr();             // 获取arp源IP地址
    QString getArpDestinationEtherAddr();     // 获取arp目的以太网地址
    QString getArpDestinationIpAddr();        // 获取arp目的IP地址

    // 获取tcp信息
    QString getTcpSourcePort();               // 获取TCP源端口
    QString getTcpDestinationPort();          // 获取TCP目的端口
    QString getTcpSequence();                 // 获取TCP序列
    QString getTcpAcknowledgment();           // 得到acknowlegment
    QString getTcpHeaderLength();             // 获取TCP头长度
    QString getTcpRawHeaderLength();          // 获取TCP原始头长度[默认为0x05]
    QString getTcpFlags();                    // 获取TCP标志
    QString getTcpPSH();                      //
    QString getTcpACK();                      // ACK标志
    QString getTcpSYN();                      // SYN标志
    QString getTcpURG();                      // 开始标志
    QString getTcpFIN();                      //
    QString getTcpRST();                      //
    QString getTcpWindowSize();               // 获取TCP窗口大小
    QString getTcpCheckSum();                 // 获取TCP校验和
    QString getTcpUrgentPointer();            // 获取TCP紧急指针
    QString getTcpOperationKind(int kind);    // 获取TCP选项类型
    int getTcpOperationRawKind(int offset);   // 获取TCP原始选项类型

    // TCP可选部件
    bool getTcpOperationMSS(int offset,u_short& mss);                          // kind = 2
    bool getTcpOperationWSOPT(int offset,u_char&shit);                         // kind = 3
    bool getTcpOperationSACKP(int offset);                                     // kind = 4
    bool getTcpOperationSACK(int offset,u_char&length,QVector<u_int>&edge);    // kind = 5
    bool getTcpOperationTSPOT(int offset,u_int& value,u_int&reply);            // kind = 8

    // 获取udp信息
    QString getUdpSourcePort();               // 获取udp源端口
    QString getUdpDestinationPort();          // 获取udp目的端口
    QString getUdpDataLength();               // 获取udp数据长度
    QString getUdpCheckSum();                 // 获取udp校验和

    // 获取dns信息
    QString getDnsTransactionId();            // 获取DNS事务
    QString getDnsFlags();                    // 获取DNS标志
    QString getDnsFlagsQR();                  // 获取dns标志QR
    QString getDnsFlagsOpcode();              // 获取DNS标志操作代码
    QString getDnsFlagsAA();                  // 获取dns标志AA
    QString getDnsFlagsTC();                  // 获取dns标志TC
    QString getDnsFlagsRD();                  // 获取dns标志RD
    QString getDnsFlagsRA();                  // 获取dns标志RA
    QString getDnsFlagsZ();                   // 获取dns标志Z[保留]
    QString getDnsFlagsRcode();               // 获取dns标志Rcode
    QString getDnsQuestionNumber();           // 获取DNS问题编号
    QString getDnsAnswerNumber();             // 获取DNS应答号码
    QString getDnsAuthorityNumber();          // 获取DNS机构编号
    QString getDnsAdditionalNumber();         // 获取DNS添加号
    void getDnsQueriesDomain(QString&name,int&Type,int&Class);
    QString getDnsDomainType(int type);
    QString getDnsDomainName(int offset);
    int getDnsAnswersDomain(int offset,QString&name1,u_short&Type,u_short& Class,u_int&ttl,u_short&dataLength,QString& name2);

    // 获取TLS信息
    bool getisTlsProtocol(int offset);
    void getTlsBasicInfo(int offset,u_char&contentType,u_short&version,u_short&length);
    void getTlsClientHelloInfo(int offset,u_char&handShakeType,int& length,u_short&version,QString&random,u_char&sessionIdLength,QString&sessionId,u_short&cipherLength,QVector<u_short>&cipherSuit,u_char& cmLength,QVector<u_char>&CompressionMethod,u_short&extensionLength);
    void getTlsServerHelloInfo(int offset,u_char&handShakeType,int&length,u_short&version,QString& random,u_char&sessionIdLength,QString&sessionId,u_short&cipherSuit,u_char&compressionMethod,u_short&extensionLength);
    void getTlsServerKeyExchange(int offset,u_char&handShakeType,int&length,u_char&curveType,u_short&curveName,u_char&pubLength,QString&pubKey,u_short&sigAlgorithm,u_short&sigLength,QString&sig);
    u_short getTlsExtensionType(int offset);
    void getTlsHandshakeType(int offset,u_char&type);


    void getTlsExtensionServerName(int offset,u_short&type,u_short&length,u_short&listLength,u_char&nameType,u_short&nameLength,QString& name);
    void getTlsExtensionSignatureAlgorithms(int offset,u_short&type,u_short&length,u_short&algorithmLength,QVector<u_short>&signatureAlgorithm);
    void getTlsExtensionSupportGroups(int offset,u_short&type,u_short&length,u_short&groupListLength,QVector<u_short>&group);
    void getTlsExtensionEcPointFormats(int offset,u_short&type,u_short&length,u_char& ecLength,QVector<u_char>&EC);
    void getTlsExtensionSessionTicket(int offset,u_short&type,u_short&length);
    void getTlsExtensionEncryptThenMac(int offset,u_short&type,u_short&length);
    void getTlsExtensionSupportVersions(int offset,u_short&type,u_short&length,u_char&supportLength,QVector<u_short>&supportVersion);
    void getTlsExtensionPskKeyExchangeModes(int offset,u_short&type,u_short&length,u_char&modeLength,QVector<u_char>&mode);
    void getTlsExtensionKeyShare(int offset,u_short&type,u_short&length,u_short&shareLength,u_short&group,u_short&exchangeLength,QString& exchange);
    void getTlsExtensionOther(int offset,u_short&type,u_short&length,QString& data);
    void getTlsExtensionExtendMasterSecret(int offset,u_short&type,u_short&length);
    void getTlsExtensionPadding(int offset,u_short&type,u_short&length,QString&data);

    //解析编码数据
    static QString getTlsHandshakeType(int type);                          // 解析TLS握手类型
    static QString getTlsContentType(int type);                            // 解析TLS内容类型
    static QString getTlsVersion(int version);                             // 解析TLS版本
    static QString getTlsHandshakeCipherSuites(u_short code);              // 解析TLS密码套件
    static QString getTlsHandshakeCompression(u_char code);                // 解析TLS压缩
    static QString getTlsHandshakeExtension(u_short type);                 // 解析TLS扩展
    static QString getTlsHandshakeExtensionECPointFormat(u_char type);     // 解析TLS EC点格式
    static QString getTlsHandshakeExtensionSupportGroup(u_short type);     // 解析TLS支持组
    static QString getTlsHadshakeExtensionSignature(u_char type);          // 解析TLS签名
    static QString getTlsHadshakeExtensionHash(u_char type);               // 解析TLS散列


};

#endif // DATAPACKAGE_H
